package myrule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class MySelfRule
{
	@Bean
	public IRule myRule()
	{
		return new AbstractLoadBalancerRule() {

			@Override
			public void initWithNiwsConfig(IClientConfig clientConfig) {

			}

			@Override
			public Server choose(Object key) {
				return choose(getLoadBalancer(), key);
			}

			private int total = 0; 			// 总共被调用的次数，目前要求每台被调用5次
			private int currentIndex = 0;	// 当前提供服务的机器号

			public Server choose(ILoadBalancer lb, Object key) {
				if (lb == null) {
					return null;
				}
				Server server = null;

				while (server == null) {
					if (Thread.interrupted()) {
						return null;
					}
					List<Server> upList = lb.getReachableServers();
					List<Server> allList = lb.getAllServers();

					int serverCount = allList.size();
					if (serverCount == 0) {
						/*
						 * No servers. End regardless of pass, because subsequent passes only get more
						 * restrictive.
						 */
						return null;
					}

					if(total < 5)
					{
						server = upList.get(currentIndex);
						total++;
					}else {
						total = 0;
						currentIndex++;
						if(currentIndex >= upList.size())
						{
							currentIndex = 0;
						}
					}


					if (server == null) {
						/*
						 * The only time this should happen is if the server list were somehow trimmed.
						 * This is a transient condition. Retry after yielding.
						 */
						Thread.yield();
						continue;
					}

					if (server.isAlive()) {
						return (server);
					}

					// Shouldn't actually happen.. but must be transient or a bug.
					server = null;
					Thread.yield();
				}

				return server;
			}
		};
		//return new RandomRule();// Ribbon默认是轮询，我自定义为随机
		//return new RoundRobinRule();// Ribbon默认是轮询，我自定义为随机
	}
}
